Guava লাইব্রেরি functional programming (FP)-এর ধারণাকে Java-তে বাস্তবায়িত করার জন্য একটি শক্তিশালী সাপোর্ট সরবরাহ করে। Guava এর মাধ্যমে Java-তে functions, predicates, এবং suppliers ইত্যাদি ব্যবহার করে কার্যকরী প্রোগ্রামিং করা যায়। এই সব utilities Java প্রোগ্রামিংকে আরও লজিক্যাল এবং মডুলার করতে সাহায্য করে।
Guava-তে Functional Programming এর জন্য বিভিন্ন গুরুত্বপূর্ণ ক্লাস এবং মেথড রয়েছে, যা ফাংশনাল প্যাটার্নে কোড লেখাকে সহজ এবং কার্যকর করে তোলে। এখানে কিছু গুরুত্বপূর্ণ functional programming utilities আলোচনা করা হয়েছে:
Guava এর Function
ইন্টারফেস Java 8's java.util.function.Function
এর মতোই কাজ করে। এটি একটি ফাংশন গ্রহণ করে এবং একটি আউটপুট প্রদান করে।
import com.google.common.base.Function;
public class FunctionExample {
public static void main(String[] args) {
Function<String, Integer> stringToLength = new Function<String, Integer>() {
@Override
public Integer apply(String input) {
return input.length();
}
};
System.out.println(stringToLength.apply("Hello")); // আউটপুট: 5
}
}
Guava এর Predicate
একটি ফাংশনাল ইন্টারফেস, যা একটি শর্ত যাচাই করে এবং একটি boolean রিটার্ন করে। এটি সাধারণত filtering বা validation কাজের জন্য ব্যবহৃত হয়।
import com.google.common.base.Predicate;
public class PredicateExample {
public static void main(String[] args) {
Predicate<String> isNotEmpty = new Predicate<String>() {
@Override
public boolean apply(String input) {
return input != null && !input.isEmpty();
}
};
System.out.println(isNotEmpty.apply("Hello")); // আউটপুট: true
System.out.println(isNotEmpty.apply("")); // আউটপুট: false
}
}
Supplier
ইন্টারফেস একটি ফাংশনাল ইন্টারফেস, যা কোনো মান সরবরাহ করে। এটি সাধারণত lazy initialization বা object creation এর জন্য ব্যবহৃত হয়।
import com.google.common.base.Supplier;
public class SupplierExample {
public static void main(String[] args) {
Supplier<String> stringSupplier = new Supplier<String>() {
@Override
public String get() {
return "Hello, Guava!";
}
};
System.out.println(stringSupplier.get()); // আউটপুট: Hello, Guava!
}
}
FluentIterable
Guava এর একটি ক্লাস, যা iterables এর উপর functional-style operations করতে দেয়, যেমন map, filter, transform, ইত্যাদি।
import com.google.common.collect.FluentIterable;
public class FluentIterableExample {
public static void main(String[] args) {
FluentIterable<Integer> numbers = FluentIterable.from(new Integer[] {1, 2, 3, 4, 5});
// Filter even numbers and double them
Iterable<Integer> result = numbers.filter(n -> n % 2 == 0)
.transform(n -> n * 2);
for (Integer num : result) {
System.out.println(num); // আউটপুট: 4, 8
}
}
}
Guava এর Maps.transformValues
একটি utility মেথড যা একটি Map এর মানগুলিকে transform করতে সাহায্য করে। এটি মূল Map এর কনটেন্ট পরিবর্তন না করেই একটি নতুন Map তৈরি করে।
import com.google.common.collect.Maps;
import java.util.Map;
public class TransformValuesExample {
public static void main(String[] args) {
Map<String, Integer> map = Maps.newHashMap();
map.put("Apple", 3);
map.put("Banana", 5);
Map<String, Integer> transformedMap = Maps.transformValues(map, value -> value * 2);
for (Map.Entry<String, Integer> entry : transformedMap.entrySet()) {
System.out.println(entry.getKey() + ": " + entry.getValue());
}
// আউটপুট:
// Apple: 6
// Banana: 10
}
}
Utility | Description | Example Use Case |
---|---|---|
Function | Maps an input to an output (similar to map in FP). | Converting a String to its length. |
Predicate | Tests a condition and returns a boolean. | Filtering a list based on conditions. |
Supplier | Provides a result without any input. | Lazy initialization of an object. |
FluentIterable | Supports functional-style operations on iterables. | Chaining filter and map operations. |
Maps.transformValues | Transforms values of a map without modifying the original. | Doubling values in a map. |
Guava Java-এর functional programming utilities ব্যবহার করে কোডকে আরও পরিষ্কার, কার্যকর, এবং পুনঃব্যবহারযোগ্য করা যায়। এটি Java প্রোগ্রামে higher-order functions, predicates, suppliers, এবং functional-style operations সহকারে নতুন সম্ভাবনা খুলে দেয়, যা Java 8 এর স্ট্যান্ডার্ড লাইব্রেরি ফিচারগুলোর পরিপূরক। Guava functional utilities ব্যবহার করলে কোডের কনসিসটেন্সি এবং পারফরম্যান্স উন্নত করা যায়।
গুয়াভা (Guava) লাইব্রেরি Java-তে Function এবং Predicate এর মতো Functional Programming ধারণা সহজে ব্যবহৃত করতে সহায়ক ক্লাস প্রদান করে। এই ক্লাসগুলো Java 8-এ প্রবর্তিত ল্যাম্বডা এক্সপ্রেশন এবং স্ট্রিম API এর সাথে একত্রে ব্যবহার করা যেতে পারে, যা কোড লেখার প্রক্রিয়াকে আরও পরিষ্কার, কার্যকর এবং সংক্ষিপ্ত করে তোলে।
এখানে আমরা Function
এবং Predicate
সম্পর্কে বিস্তারিত আলোচনা করব এবং কীভাবে গুয়াভা লাইব্রেরি এগুলোকে সহজে ব্যবহারের সুযোগ প্রদান করে তা দেখব।
Function
ইন্টারফেস Java 8-এর ফাংশনাল ইন্টারফেসের একটি অংশ, যা একটি ইনপুট টিপ (input type) নিয়ে একটি আউটপুট টিপ (output type) প্রদান করে। এটি মূলত সেই সব কাজের জন্য ব্যবহৃত হয় যেখানে এক ধরনের মানকে অন্য ধরনের মানে রূপান্তর করতে হয়।
গুয়াভা লাইব্রেরিতে Function
ইন্টারফেসের ব্যবহার আরও সহজ এবং কার্যকরী হতে পারে। এটি সাধারণত মেথড রেফারেন্স বা ল্যাম্বডা এক্সপ্রেশন এর মাধ্যমে ব্যবহৃত হয়।
import com.google.common.base.Function;
import com.google.common.collect.Lists;
import java.util.List;
public class FunctionExample {
public static void main(String[] args) {
// Function to convert String to Integer (Parsing the String)
Function<String, Integer> stringToLength = new Function<String, Integer>() {
@Override
public Integer apply(String input) {
return input.length();
}
};
// Example usage
List<String> words = Lists.newArrayList("Guava", "Java", "Function");
List<Integer> wordLengths = Lists.transform(words, stringToLength);
System.out.println(wordLengths); // Output: [5, 4, 8]
}
}
এখানে, Function<String, Integer>
একটি স্ট্রিং ইনপুট নিয়ে তার দৈর্ঘ্য হিসেবে একটি পূর্ণসংখ্যা রিটার্ন করেছে। Lists.transform()
মেথডটি একটি লিস্টের প্রতিটি উপাদানের উপর Function
প্রয়োগ করে এবং নতুন একটি লিস্ট তৈরি করে।
Predicate
ইন্টারফেস Java 8-এ আরেকটি ফাংশনাল ইন্টারফেস, যা একটি বুলিয়ান মান রিটার্ন করে। এটি সাধারণত ব্যবহৃত হয় যখন কোনও শর্তের ভিত্তিতে একটি অপারেশন করা হয়, যেমন কোনো উপাদান সঠিক কিনা পরীক্ষা করা।
গুয়াভা লাইব্রেরির Predicate
ইন্টারফেস ব্যবহার করে কোডে লজিক্যাল শর্ত এবং ফিল্টারিং কার্যক্রম সহজে করা যায়।
import com.google.common.base.Predicate;
import com.google.common.collect.Iterables;
import java.util.List;
public class PredicateExample {
public static void main(String[] args) {
// Predicate to check if the word length is greater than 4
Predicate<String> lengthGreaterThanFour = new Predicate<String>() {
@Override
public boolean apply(String input) {
return input.length() > 4;
}
};
// Example usage
List<String> words = Lists.newArrayList("Guava", "Java", "Function");
Iterable<String> filteredWords = Iterables.filter(words, lengthGreaterThanFour);
System.out.println(filteredWords); // Output: [Guava, Function]
}
}
এখানে, Predicate<String>
একটি শর্ত নির্ধারণ করে যা স্ট্রিংটির দৈর্ঘ্য ৪ এর চেয়ে বড় কিনা তা চেক করে। Iterables.filter()
মেথডটি এই শর্ত অনুযায়ী লিস্টের উপাদানগুলিকে ফিল্টার করে।
String
থেকে Integer
(যেমন, স্ট্রিংয়ের দৈর্ঘ্য গণনা করা)।গুয়াভা লাইব্রেরি Function
এবং Predicate
ইন্টারফেসের সাথে কাজ করার জন্য অনেক উন্নত ইউটিলিটি সরবরাহ করে, যেমন Lists.transform()
, Iterables.filter()
ইত্যাদি, যা ফাংশনাল প্রোগ্রামিংয়ের ধারণা অনুসারে কোড লেখার প্রক্রিয়াকে আরও সহজ করে তোলে। এগুলি স্ট্রিমিং, ম্যানিপুলেশন এবং শর্ত যাচাইয়ের কাজগুলো দ্রুত ও কার্যকরভাবে সম্পাদন করতে সাহায্য করে।
গুয়াভা লাইব্রেরির Function এবং Predicate ইন্টারফেস Java-তে Functional Programming ধারণাগুলি কার্যকরভাবে ব্যবহার করার সুযোগ দেয়। Function একটি মানকে অন্য ধরনের মানে রূপান্তর করে, এবং Predicate একটি শর্ত যাচাই করে। এই দুটি ইন্টারফেসের সাহায্যে কোডের পরিষ্কারতা, কার্যকারিতা এবং সংক্ষিপ্ততা বৃদ্ধি পায়, যা Java ডেভেলপারদের জন্য অত্যন্ত সহায়ক।
গুয়াভা (Guava) লাইব্রেরি জাভাতে ফাংশনাল প্রোগ্রামিং ধারণার প্রয়োগে সহায়ক বিভিন্ন ইন্টারফেস এবং ইউটিলিটি সরবরাহ করে। জাভা ৮ এর পর থেকে ফাংশনাল প্রোগ্রামিং অনেক জনপ্রিয় হয়ে উঠেছে এবং গুয়াভা লাইব্রেরি এই ধারার সুবিধাগুলি আরও উন্নত এবং ব্যবহারযোগ্য করে তোলে। গুয়াভা লাইব্রেরির ফাংশনাল ইন্টারফেসগুলি বিভিন্ন কাজকে আরও সহজ, গতিশীল এবং কোডের পুনঃব্যবহারযোগ্যতা বৃদ্ধি করতে সহায়ক।
ফাংশনাল ইন্টারফেস বলতে এমন কোনো ইন্টারফেসকে বোঝানো হয়, যা শুধুমাত্র একটি অ্যাবস্ট্রাক্ট মেথড ধারণ করে। ফাংশনাল ইন্টারফেসের সুবিধা হলো এগুলিকে ল্যাম্বডা এক্সপ্রেশন বা মেথড রেফারেন্স দিয়ে সংজ্ঞায়িত করা যায়, যা কোডের পঠনযোগ্যতা ও সরলতা বাড়ায়।
গুয়াভা লাইব্রেরিতে বিভিন্ন ধরনের ফাংশনাল ইন্টারফেস সরবরাহ করা হয়েছে যা ফাংশনাল প্রোগ্রামিংয়ের জন্য খুবই উপকারী। এখানে কিছু গুরুত্বপূর্ণ ফাংশনাল ইন্টারফেসের ব্যবহার আলোচনা করা হলো।
গুয়াভা লাইব্রেরির Function
ইন্টারফেসটি জাভা ৮ এর java.util.function.Function
এর সাথে মিলে। এটি একটি ইনপুট নিয়ে আউটপুট প্রদান করে।
import com.google.common.base.Function;
public class GuavaFunctionExample {
public static void main(String[] args) {
// Function ইন্টারফেসের ব্যবহার
Function<String, Integer> stringToLength = new Function<String, Integer>() {
@Override
public Integer apply(String input) {
return input.length();
}
};
System.out.println(stringToLength.apply("Guava")); // Output: 5
}
}
এখানে, Function
ইন্টারফেসের apply
মেথড ব্যবহার করে একটি স্ট্রিংয়ের দৈর্ঘ্য বের করা হচ্ছে।
গুয়াভার Predicate
ইন্টারফেস একটি পছন্দ বা শর্ত পরীক্ষা করার জন্য ব্যবহৃত হয়। এটি একটি ইনপুট গ্রহণ করে এবং বুলিয়ান মান (true বা false) প্রদান করে।
import com.google.common.base.Predicate;
public class GuavaPredicateExample {
public static void main(String[] args) {
// Predicate ইন্টারফেসের ব্যবহার
Predicate<String> isNotEmpty = new Predicate<String>() {
@Override
public boolean apply(String input) {
return input != null && !input.isEmpty();
}
};
System.out.println(isNotEmpty.apply("Guava")); // Output: true
System.out.println(isNotEmpty.apply("")); // Output: false
}
}
এখানে, Predicate
ইন্টারফেসটি স্ট্রিংটি খালি কিনা তা পরীক্ষা করার জন্য ব্যবহৃত হচ্ছে।
গুয়াভা লাইব্রেরির Supplier
ইন্টারফেসটি এমন একটি ফাংশনাল ইন্টারফেস, যা কোনো ইনপুট গ্রহণ না করেই একটি আউটপুট প্রদান করে। এটি সাধারণত এমন কাজের জন্য ব্যবহৃত হয় যেখানে একটি মান তৈরি করা প্রয়োজন।
import com.google.common.base.Supplier;
import java.util.Random;
public class GuavaSupplierExample {
public static void main(String[] args) {
// Supplier ইন্টারফেসের ব্যবহার
Supplier<Integer> randomSupplier = new Supplier<Integer>() {
@Override
public Integer get() {
return new Random().nextInt(100); // 0 থেকে 99 এর মধ্যে একটি র্যান্ডম সংখ্যা
}
};
System.out.println(randomSupplier.get()); // Output: একটি র্যান্ডম সংখ্যা
}
}
এখানে, Supplier
ইন্টারফেসটি একটি র্যান্ডম সংখ্যা উৎপন্ন করতে ব্যবহৃত হয়েছে।
গুয়াভা লাইব্রেরির Transformer
ইন্টারফেসটি Function
এর মতো, তবে এটি বিশেষত আইটেমগুলির একটি কোলেকশন বা একাধিক উপাদানকে ট্রান্সফর্ম করার জন্য ব্যবহৃত হয়।
import com.google.common.base.Transformer;
public class GuavaTransformerExample {
public static void main(String[] args) {
// Transformer ইন্টারফেসের ব্যবহার
Transformer<String, String> toUpperCase = new Transformer<String, String>() {
@Override
public String transform(String input) {
return input.toUpperCase();
}
};
System.out.println(toUpperCase.transform("guava")); // Output: GUAVA
}
}
এখানে, Transformer
ইন্টারফেসের মাধ্যমে একটি স্ট্রিংকে uppercase ফরম্যাটে রূপান্তর করা হয়েছে।
ফাংশনাল ইন্টারফেস ব্যবহার করে কোডের সংক্ষিপ্ততা বৃদ্ধি পায়। উদাহরণস্বরূপ, ল্যাম্বডা এক্সপ্রেশন ব্যবহার করলে ঐ একই কোড আরও সহজ ও সংক্ষিপ্ত হয়।
ফাংশনাল ইন্টারফেসগুলির ব্যবহার কোডের পুনঃব্যবহারযোগ্যতা বাড়ায়। একবার তৈরি করা ফাংশনাল ইন্টারফেস অনেক জায়গায় ব্যবহার করা যেতে পারে, যার ফলে কোডের রক্ষণাবেক্ষণ সহজ হয়।
ফাংশনাল ইন্টারফেসের মাধ্যমে সমান্তরাল বা অ্যাসিঙ্ক্রোনাস কাজ করা সহজ হয়, ফলে অ্যাপ্লিকেশনটির প্রতিক্রিয়া গতি এবং পারফরম্যান্স বৃদ্ধি পায়।
গুয়াভা লাইব্রেরির ফাংশনাল ইন্টারফেসগুলি জাভা ডেভেলপারদের জন্য কার্যকরী ফাংশনাল প্রোগ্রামিং কৌশলগুলি ব্যবহার করার জন্য একটি শক্তিশালী টুলকিট সরবরাহ করে। এগুলি কোডকে আরও সহজ, পরিষ্কার, এবং পুনঃব্যবহারযোগ্য করে তোলে, যা ডেভেলপমেন্টের গতি এবং পারফরম্যান্স বাড়াতে সহায়তা করে।
Guava লাইব্রেরি Java প্রোগ্রামিংয়ে ফাংশনাল প্রোগ্রামিং কনসেপ্টে সহায়ক বিভিন্ন ফিচার সরবরাহ করে, এর মধ্যে Function Composition এবং Chaining অন্যতম। এই দুটি ধারণা ব্যবহার করে আপনি বিভিন্ন ফাংশনকে একত্রিত করতে এবং তাদের কার্যক্রম একত্রে চালাতে পারেন, যা কোডের রিডেবিলিটি, পুনঃব্যবহারযোগ্যতা এবং কার্যকারিতা বাড়ায়।
Function Composition হল দুটি বা তার বেশি ফাংশনকে একত্রিত করার প্রক্রিয়া, যেখানে একটি ফাংশনের আউটপুট পরবর্তী ফাংশনের ইনপুট হিসেবে ব্যবহৃত হয়। Guava লাইব্রেরি একটি শক্তিশালী Function.compose()
এবং Function.andThen()
মেথড প্রদান করে, যা ফাংশন কম্পোজিশনের জন্য ব্যবহৃত হয়।
Function.compose()
: এই মেথডটি দুটি ফাংশনকে একত্রিত করে, যেখানে প্রথম ফাংশনটি দ্বিতীয় ফাংশনের আগে চলে। অর্থাৎ, প্রথম ফাংশনের আউটপুট পরবর্তী ফাংশনের ইনপুট হয়ে যাবে।Function.andThen()
: এই মেথডটি দুটি ফাংশনকে একত্রিত করে, যেখানে প্রথম ফাংশনের আউটপুট দ্বিতীয় ফাংশনের ইনপুট হিসেবে কাজ করবে, তবে প্রথম ফাংশনটি দ্বিতীয়টির পরে চলে।import com.google.common.base.Function;
import com.google.common.base.Functions;
public class FunctionCompositionExample {
public static void main(String[] args) {
// প্রথম ফাংশন: String কে তার দৈর্ঘ্যে পরিণত করা
Function<String, Integer> lengthFunction = new Function<String, Integer>() {
@Override
public Integer apply(String input) {
return input.length();
}
};
// দ্বিতীয় ফাংশন: সংখ্যাকে দ্বিগুণ করা
Function<Integer, Integer> doubleFunction = new Function<Integer, Integer>() {
@Override
public Integer apply(Integer input) {
return input * 2;
}
};
// Function.compose() ব্যবহার করে প্রথমে length এবং তারপর double ফাংশন চেইনিং
Function<String, Integer> composedFunction = Functions.compose(doubleFunction, lengthFunction);
// ফলাফল
System.out.println(composedFunction.apply("Hello")); // Output: 10 (length=5, then double=10)
}
}
এখানে, প্রথমে lengthFunction
স্ট্রিংয়ের দৈর্ঘ্য বের করে এবং তারপর doubleFunction
সেই দৈর্ঘ্যকে দ্বিগুণ করে।
Function Chaining হল একাধিক ফাংশনকে একে একে, সিকুয়েনশিয়ালভাবে চালানোর প্রক্রিয়া। Guava এর Function.andThen()
মেথড ফাংশন চেইনিংয়ের জন্য ব্যবহৃত হয়।
import com.google.common.base.Function;
import com.google.common.base.Functions;
public class FunctionChainingExample {
public static void main(String[] args) {
// প্রথম ফাংশন: String কে তার দৈর্ঘ্যে পরিণত করা
Function<String, Integer> lengthFunction = new Function<String, Integer>() {
@Override
public Integer apply(String input) {
return input.length();
}
};
// দ্বিতীয় ফাংশন: সংখ্যাকে দ্বিগুণ করা
Function<Integer, Integer> doubleFunction = new Function<Integer, Integer>() {
@Override
public Integer apply(Integer input) {
return input * 2;
}
};
// Function.andThen() ব্যবহার করে প্রথম length ফাংশন এবং তারপর double ফাংশন চেইনিং
Function<String, Integer> chainedFunction = lengthFunction.andThen(doubleFunction);
// ফলাফল
System.out.println(chainedFunction.apply("Hello")); // Output: 10 (length=5, then double=10)
}
}
এখানে, প্রথমে lengthFunction
স্ট্রিংয়ের দৈর্ঘ্য বের করে এবং তারপরে doubleFunction
সেই দৈর্ঘ্যকে দ্বিগুণ করে। এখানে ফাংশনগুলি andThen()
মেথড ব্যবহার করে চেইন করা হয়েছে, যেখানে প্রথম ফাংশনটি সম্পন্ন হওয়ার পর দ্বিতীয় ফাংশনটি কার্যকর হয়।
Guava লাইব্রেরির Function Composition এবং Chaining কনসেপ্ট দুটি Java প্রোগ্রামিংয়ে ফাংশনাল প্রোগ্রামিংয়ের সুবিধা নিয়ে আসে, যা কোডকে আরো সংহত, পুনঃব্যবহারযোগ্য, এবং সহজ করে তোলে। ফাংশনগুলোকে একে অপরের সাথে সংযুক্ত করে এবং সঠিকভাবে কম্পোজ করে, একটি শক্তিশালী, পরিষ্কার এবং কার্যকরী কোডবেস তৈরি করা যায়।
Guava লাইব্রেরি Java ডেভেলপমেন্টে প্রেডিকেটস (Predicates) এবং ফাংশনাল ইউটিলিটিস (Functional Utilities) সরবরাহ করে, যা ফাংশনাল প্রোগ্রামিং কনসেপ্টের উপর ভিত্তি করে তৈরি। এই ফিচারগুলির মাধ্যমে ডেটা ফিল্টারিং, ট্রান্সফরমেশন, এবং অন্যান্য ফাংশনাল অপারেশনগুলোকে আরও কার্যকরী এবং সহজ করা সম্ভব। Guava এর Predicate
এবং Function
ক্লাসগুলির সাহায্যে আপনি অধিকতর পরিষ্কার এবং কার্যকরী কোড লিখতে পারবেন। নিচে আমরা Predicates এবং Functional Utilities এর কয়েকটি গুরুত্বপূর্ণ উদাহরণ আলোচনা করব।
Guava Predicate
ক্লাসটি একটি ফাংশনাল ইন্টারফেস যা একটি নির্দিষ্ট শর্তের উপর ভিত্তি করে যেকোনো অবজেক্টকে পরীক্ষা করতে ব্যবহৃত হয়। এটি মূলত শর্ত যাচাইয়ের জন্য ব্যবহার করা হয়, যেমন কোনো ভ্যালু সত্য (true) কিনা।
সাধারণ Predicate উদাহরণ
একটি সাধারণ Predicate
ব্যবহার করে দেখানো হলো, যা একটি সংখ্যা পজিটিভ কিনা পরীক্ষা করে।
import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
public class PredicateExample {
public static void main(String[] args) {
Predicate<Integer> isPositive = new Predicate<Integer>() {
@Override
public boolean apply(Integer number) {
return number > 0;
}
};
System.out.println(isPositive.apply(10)); // আউটপুট: true
System.out.println(isPositive.apply(-5)); // আউটপুট: false
}
}
Predicates.and() এবং Predicates.or()
Predicates.and()
এবং Predicates.or()
মেথডগুলি দিয়ে একাধিক শর্ত একত্রে পরীক্ষা করা যায়। and()
মেথডটি সমস্ত শর্তের সত্যতা পরীক্ষা করে, এবং or()
মেথডটি যেকোনো একটি শর্তের সত্যতা পরীক্ষা করে।
উদাহরণ:
Predicate<Integer> isPositive = new Predicate<Integer>() {
@Override
public boolean apply(Integer number) {
return number > 0;
}
};
Predicate<Integer> isEven = new Predicate<Integer>() {
@Override
public boolean apply(Integer number) {
return number % 2 == 0;
}
};
Predicate<Integer> isPositiveAndEven = Predicates.and(isPositive, isEven);
Predicate<Integer> isPositiveOrEven = Predicates.or(isPositive, isEven);
System.out.println(isPositiveAndEven.apply(4)); // আউটপুট: true
System.out.println(isPositiveOrEven.apply(3)); // আউটপুট: false
Guava লাইব্রেরি ফাংশনাল প্রোগ্রামিং কনসেপ্টের জন্য আরও কিছু ইউটিলিটি মেথড প্রদান করে, যেমন Function
, Functions
, FluentIterable
, এবং Lists.transform()
ইত্যাদি। এই ফিচারগুলি কোডের পুনঃব্যবহারযোগ্যতা বাড়াতে এবং আরও সহজভাবে অপারেশন করতে সাহায্য করে।
Function Interface
Guava এর Function
ইন্টারফেস ব্যবহার করে ডেটা ট্রান্সফরমেশন করা যায়। Function
একটি ইনপুট নিয়ে একটি আউটপুট প্রদান করে।
উদাহরণ:
import com.google.common.base.Function;
import com.google.common.collect.Lists;
public class FunctionExample {
public static void main(String[] args) {
Function<String, Integer> stringToLength = new Function<String, Integer>() {
@Override
public Integer apply(String input) {
return input.length();
}
};
System.out.println(stringToLength.apply("Hello")); // আউটপুট: 5
}
}
Lists.transform()
Lists.transform()
মেথডটি একটি List
এর প্রতিটি উপাদানকে একটি নির্দিষ্ট ফাংশন দিয়ে ট্রান্সফর্ম (পরিবর্তন) করতে ব্যবহৃত হয়।
উদাহরণ:
import com.google.common.collect.Lists;
import com.google.common.base.Function;
import java.util.List;
public class ListsTransformExample {
public static void main(String[] args) {
List<String> names = Lists.newArrayList("Alice", "Bob", "Charlie");
// প্রতিটি নামের দৈর্ঘ্য বের করতে একটি Function ব্যবহার করা
List<Integer> nameLengths = Lists.transform(names, new Function<String, Integer>() {
@Override
public Integer apply(String name) {
return name.length();
}
});
System.out.println(nameLengths); // আউটপুট: [5, 3, 7]
}
}
FluentIterable
Guava এর FluentIterable
ক্লাসটি একটি ইন্টারফেস যা একটি সংগ্রহের উপর লজিকাল অপারেশনগুলোকে সহজভাবে চেইনিং করতে সহায়ক। এটি বিভিন্ন ফাংশনাল অপারেশন একসাথে চেইন করে ব্যবহার করা যেতে পারে।
উদাহরণ:
import com.google.common.collect.FluentIterable;
public class FluentIterableExample {
public static void main(String[] args) {
FluentIterable<String> iterable = FluentIterable.from(Lists.newArrayList("Apple", "Banana", "Cherry"))
.transform(new Function<String, String>() {
@Override
public String apply(String input) {
return input.toUpperCase();
}
});
System.out.println(iterable.toList()); // আউটপুট: [APPLE, BANANA, CHERRY]
}
}
Functions.compose()
Functions.compose()
মেথডটি দুটি ফাংশনকে একত্রিত করতে ব্যবহৃত হয়। এটি প্রথমে একটি ফাংশন প্রয়োগ করে তারপর তার আউটপুটের উপর আরেকটি ফাংশন প্রয়োগ করে।
উদাহরণ:
import com.google.common.base.Function;
import com.google.common.base.Functions;
public class FunctionComposeExample {
public static void main(String[] args) {
Function<String, Integer> toLength = new Function<String, Integer>() {
@Override
public Integer apply(String input) {
return input.length();
}
};
Function<Integer, String> toString = new Function<Integer, String>() {
@Override
public String apply(Integer input) {
return "Length: " + input;
}
};
// Functions.compose() দ্বারা দুটি ফাংশন একত্রিত করা
Function<String, String> lengthDescription = Functions.compose(toString, toLength);
System.out.println(lengthDescription.apply("Hello")); // আউটপুট: Length: 5
}
}
Guava লাইব্রেরি Java ডেভেলপমেন্টে Predicate
এবং ফাংশনাল ইউটিলিটিগুলির মাধ্যমে কোডের কার্যক্ষমতা ও পরিষ্কারতা অনেক বৃদ্ধি করতে সাহায্য করে। Predicate
শর্ত যাচাইয়ের জন্য এবং Function
ডেটা ট্রান্সফরমেশন এর জন্য খুবই কার্যকরী, এবং ফাংশনাল প্রোগ্রামিং কনসেপ্টের এই সরঞ্জামগুলি কোড লেখার প্রক্রিয়া অনেক সহজ এবং কার্যকরী করে তোলে।
Read more